#include <windows.h>
#include <iostream>
#include <comdef.h>  // 用于 BSTR 和 COM 错误处理
// 使用 RAII 管理 COM 初始化和卸载
class ComInitializerEx {
public:
    ComInitializerEx(DWORD comFlags) {
        HRESULT hr = ::CoInitializeEx(nullptr, comFlags);
        if (hr == S_OK || hr == S_FALSE) {
            initialized_ = true;
        } else {
            std::cerr << "Failed to initialize COM: " << std::hex << hr << std::dec << std::endl;
            initialized_ = false;
        }
    }
    ~ComInitializerEx() {
        if (initialized_) {
            ::CoUninitialize();
        }
    }
    bool initialized() const { return initialized_; }

private:
    bool initialized_;
};
// 处理 COM 字符串（BSTR）的例子
void ComStringExample() {
    // 分配一个 BSTR 字符串
    BSTR bstr = ::SysAllocString(L"Hello, COM World!");
    if (bstr == nullptr) {
        std::cerr << "Failed to allocate BSTR memory!" << std::endl;
        return;
    }
    // 打印 BSTR 字符串
    wprintf(L"BSTR String: %s\n", bstr);
    // 释放 BSTR 内存
    ::SysFreeString(bstr);
}
int main() {
    // 初始化 COM（多线程模型）
    ComInitializerEx comInit(COINIT_MULTITHREADED);
    if (!comInit.initialized()) {
        std::cerr << "COM initialization failed!" << std::endl;
        return 1;
    }
    // 调用 COM 字符串示例
    ComStringExample();
    // 可以在此处继续其他 COM 操作...
    return 0;
}